#!/bin/bash

declare -r daemon_name=sshguard
declare -r daemon_prog=/usr/sbin/sshguard

################################################################################
the_daemon()
################################################################################
{
    daemon --name "${daemon_name}" "${@}"
}

################################################################################
the_damon_start()
################################################################################
{
    if ! the_daemon --running; then
        echo "Starting ${daemon_name}:  ${daemon_prog}"

        the_daemon -- ${daemon_prog}
    else
        echo "${daemon_name} seems to be already running."
    fi
}

################################################################################
the_damon_stop()
################################################################################
{
    if the_daemon --running; then
        echo "Stopping ${daemon_name}."

        the_daemon --stop
    else
        echo "${daemon_name} does not seem to be running."
    fi
}

################################################################################
the_damon_restart()
################################################################################
{
    if the_daemon --running; then
        the_damon_stop
        the_daemon_wait_stopped
        the_damon_start
    else
        echo "${daemon_name} does not seem to be running."
    fi
}

################################################################################
the_daemon_wait_stopped()
################################################################################
{
    # All time values given in a unit of 0.1 second.

    local -r timeout=50
    local delay=1
    local delay_sum=0
    local -r test_expr=(the_daemon --running)

    # Poll (with timeout) for the daemon to exit.

    while "${test_expr[@]}" && [[ ${delay_sum} -lt ${timeout} ]]; do
        sleep $(echo "${delay} / 10.0" | bc -l)
        delay_sum=$((delay_sum + delay))

        # Double the delay in each iteration to lower the CPU use.

        delay=$((delay * 2))

        # Adjust next's iteration delay prevent waiting longer than _timeout_
        # in case the time already waited and the delay to be waited in
        # the next iteration would be greater than the requested _timeout_.

        if [[ $((delay_sum + delay)) -gt ${timeout} ]]; then
            delay=$((timeout - delay_sum))
        fi
    done

    if "${test_expr[@]}"; then
        echo "Timeout waiting for ${daemon_name} to stop."

        exit 1
    fi
}

case "${1}" in
start)
    the_damon_start
;;

stop)
    the_damon_stop
;;

restart)
    the_damon_restart
;;

*)
    echo "usage: ${0} start|stop|restart"
;;
esac
